iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 19
1

機車物流

昨天原本要動工介紹 電子發票 ,但突然在 google 廣告看到:lalamovegogovan 的網站介紹,之前在找有哪些機車物流有提供 API 串接時,有注意到 lalamove 在 2017/10 獲得資金後,預計開放API系統串接,沒想到終於看到 lalamove 提供 API 的消息,不過實際到官網上看,目前應該是只有開放給企業客戶使用。

失望之餘順手點開 gogovan ,沒想到竟然有提供 API 測試,不知道之前怎麼會漏掉這間,事不宜遲拿來當插件題目 XD

GOGOVAN

gogovan 提供網頁、APP、電話叫件,也可以根據不同配送需求,選擇附加服務,標榜所有貨物都能在當日送達。

在台灣目前提供三種配送方式
gogovan

時效性以機車來說最慢 90 分鐘內會送達,但快速的便利性也反映在運費上。

自司機收取貨件後開始計算:

里程總計金額 配送所需時間
$90-$130 30分鐘內
$140-$180 45分鐘內
$190-$230 60分鐘內
$240-$280 90分鐘內

GOGOVAN API

提供了五個國家的 API
GoGoVan API documentation - TW

API 功能:

  • 費用試算
  • 送出訂單
  • 取消訂單
  • 訂單狀態查詢

必填項目:

  • GoGoVan-API-Key
  • GoGoVan-User-Language
  • order[name]
  • order[phone_number]
  • order[pickup_time]
  • order[vehicle]
  • order[locations]
  • order[title_prefix]
  • API URL

費用試算 API
GET https://gogovan-staging-tw.herokuapp.com/api/v0/orders/price.json

每個國家使用的 API key 都是固定的
台灣的是 b87d2da0-d333-4dbd-b984-b7d05d232fa3
User-Language 可以是 en-US, zh-TW, zh-CN
這兩個參數需要放在 header 中

$header = array(
  'GoGoVan-API-Key: b87d2da0-d333-4dbd-b984-b7d05d232fa3',
  'GoGoVan-User-Language: zh-TW',
);

document curl example

-F 'order[name]=Eddie' \
-F 'order[phone_number]=0912345678' \
-F 'order[pickup_time]=2016-01-30T18:00:00H' \
-F 'order[vehicle]=van' \
-F 'order[locations]=[[25.0552809,121.544679,"台北市松山區興安街174巷6號1樓"],[25.1344639,121.506923,"台北市北投區溫泉路68巷24號1樓"]]'

因為官方範例的 'order' 參數是使用 -F(--form) 傳送,對應到 php curl 的寫法,就要把 'order' 放到 CURLOPT_POSTFIELDS 中,並將 CURLOPT_CUSTOMREQUEST 設為 'GET'

curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $body );
//full curl setting
$ch = curl_init("https://gogovan-staging-tw.herokuapp.com/api/v0/orders/price.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'form[param1]=A&form[param2]=B');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

第二個要解決的是 'order['locations']' 的參數問題,GOGOVAN 期望收到的格式是

order[locations]=[[25.0552809,121.544679,"台北市松山區XXX"],[25.1344639,121.506923,"台北市北投區YYY"]]

如果直接把 arrayhttp_build_query() 轉成 GET 格式

$order['locations'] = array(
	array(25.0552809,121.544679, '台北市松山區XXX')
	, array(25.1344639,121.5069234, '台北市北投區YYY')
);

$urlQuery = http_build_query($order);

會得到

locations[0][0]=25.0552809&locations[0][1]=121.544679&locations[0][2]=台北市松山區XXX&locations[1][0]=25.1344639&locations[1][1]=121.5069234&locations[1][2]=台北市北投區YYY

所以應該要選擇 json_encode() 來處理 'location'

{"locations":[[25.0552809,121.544679,"\u53f0\u5317\u5e02\u677e\u5c71\u5340XXX"],[25.1344639,121.5069234,"\u53f0\u5317\u5e02\u5317\u6295\u5340YYY"]]}

但由於當 php array key 為 string 時, json_encode() 會轉成 object data type

In JSON; Curly braces hold objects ({}), Square brackets hold arrays ([]).

為了避免出現大括號({}),我們將參數 'locations' 獨立到另一個 array

$locations = array(
  array(25.0552809,121.544679, '台北市松山區XXX')
  , array(25.1344639,121.5069234, '台北市北投區YYY')
);

再把參數拆成兩部分組成 url query,就可以順利得到完整 response 了

$urlQuery = http_build_query($postData).'&order[locations]='.json_encode($locations);
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlQuery);

上一篇
Day 17 - 歐付寶 (6) 物流串接-2
下一篇
Day 19 - GOGOVAN (2) API 使用
系列文
使用PHP串接金流相關API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
eric19740521
iT邦新手 1 級 ‧ 2020-01-27 01:46:37

GOGOVAN 測試網址 找不到了

我要留言

立即登入留言